package cn.iocoder.lw.module.core.service.workorder;

import cn.iocoder.lw.framework.common.pojo.PageResult;
import cn.iocoder.lw.module.core.controller.admin.workorder.vo.workorder.*;
import cn.iocoder.lw.module.core.controller.app.workorder.vo.workorder.AppCoreWorkOrderCreateReqVO;
import cn.iocoder.lw.module.core.controller.app.workorder.vo.workorder.AppCoreWorkOrderUpdateReqVO;
import cn.iocoder.lw.module.core.controller.app.workorder.vo.workorder.AppCoreWorkOrderPageReqVO;
import cn.iocoder.lw.module.core.dal.dataobject.workorder.CoreWorkOrderDO;

import jakarta.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 工单 Service 接口
 *
 * @author Lw源码
 */
public interface CoreWorkOrderService {

    /**
     * 创建工单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createWorkOrder(@Valid CoreWorkOrderSaveReqVO createReqVO);

    /**
     * 创建工单(APP端)
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createWorkOrderApp(@Valid AppCoreWorkOrderCreateReqVO createReqVO);

    /**
     * 更新工单
     *
     * @param updateReqVO 更新信息
     */
    void updateWorkOrder(@Valid CoreWorkOrderSaveReqVO updateReqVO);

    /**
     * 更新工单(APP端)
     *
     * @param updateReqVO 更新信息
     */
    void updateWorkOrderApp(@Valid AppCoreWorkOrderUpdateReqVO updateReqVO);

    /**
     * 删除工单
     *
     * @param id 编号
     */
    void deleteWorkOrder(Long id);

    /**
     * 获得工单
     *
     * @param id 编号
     * @return 工单
     */
    CoreWorkOrderDO getWorkOrder(Long id);

    /**
     * 获得工单分页
     *
     * @param pageReqVO 分页查询
     * @return 工单分页
     */
    PageResult<CoreWorkOrderDO> getWorkOrderPage(CoreWorkOrderPageReqVO pageReqVO);

    /**
     * 获得工单分页(APP端)
     *
     * @param pageReqVO 分页查询
     * @return 工单分页
     */
    PageResult<CoreWorkOrderDO> getWorkOrderPageApp(AppCoreWorkOrderPageReqVO pageReqVO);

    /**
     * 校验工单存在
     *
     * @param id 编号
     * @return 工单
     */
    CoreWorkOrderDO validateWorkOrderExists(Long id);

    /**
     * 派单
     *
     * @param id 工单编号
     * @param assigneeId 接单人ID
     * @param assigneePhone 接单人电话
     * @param assigneeName 接单人姓名
     */
    void assignWorkOrder(Long id, Long assigneeId, String assigneePhone, String assigneeName);

    /**
     * 接单
     *
     * @param id 工单编号
     * @param assigneeId 接单人ID
     */
    void acceptWorkOrder(Long id, Long assigneeId);

    /**
     * 更新工单状态
     *
     * @param id 工单编号
     * @param status 新状态
     */
    void updateWorkOrderStatus(Long id, Integer status);

    /**
     * 完成工单
     *
     * @param id 工单编号
     * @param updateReqVO 完成工单信息
     */
    void completeWorkOrder(Long id, @Valid CoreWorkOrderCompleteReqVO updateReqVO);

    /**
     * 根据项目ID获取工单列表
     *
     * @param projectId 项目ID
     * @return 工单列表
     */
    List<CoreWorkOrderDO> getWorkOrderListByProjectId(Long projectId);

    /**
     * 根据房源ID获取工单列表
     *
     * @param houseId 房源ID
     * @return 工单列表
     */
    List<CoreWorkOrderDO> getWorkOrderListByHouseId(Long houseId);

    /**
     * 根据设备ID获取工单列表
     *
     * @param deviceId 设备ID
     * @return 工单列表
     */
    List<CoreWorkOrderDO> getWorkOrderListByDeviceId(Long deviceId);

    /**
     * 根据发起人ID获取工单列表
     *
     * @param initiatorId 发起人ID
     * @return 工单列表
     */
    List<CoreWorkOrderDO> getWorkOrderListByInitiatorId(Long initiatorId);

    /**
     * 根据接单人ID获取工单列表
     *
     * @param assigneeId 接单人ID
     * @return 工单列表
     */
    List<CoreWorkOrderDO> getWorkOrderListByAssigneeId(Long assigneeId);

    /**
     * 批量获取工单信息（包含关联数据）
     *
     * @param ids 工单ID列表
     * @return 工单信息Map
     */
    Map<Long, CoreWorkOrderRespVO> getWorkOrderMap(List<Long> ids);

    /**
     * 导出工单数据
     *
     * @param pageReqVO 查询条件
     * @return 导出数据
     */
    List<CoreWorkOrderRespVO> getWorkOrderList(CoreWorkOrderPageReqVO pageReqVO);

}